/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ProjetoEngenharia.DAO;

/**
 *
 * @author Felipe Freitas Gomes
 */
import ProjetoEngenharia.Model.Cidade;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.ArrayList;
import javax.swing.JOptionPane;

public class CidadeDAO {

    public static final int cNavegacaoPrimeiro = 0;
    public static final int cNavegacaoAnterior = 1;
    public static final int cNavegacaoProximo = 2;
    public static final int cNavegacaoUltimo = 3;

    public static void Salvar(Cidade cidade) {
        Connection conexao = FabricaConexao.GeraConexao();

        PreparedStatement insereSt = null;

        String sql = ("insert into cidade(idCid, NomCid, EstadCid, CepCid) "
                + "values(?,?,?,?)");
        try {
            insereSt = conexao.prepareStatement(sql);
            insereSt.setInt(1, cidade.getCodigo());
            insereSt.setString(2, cidade.getNome());
            insereSt.setString(3, cidade.getEstado());
            insereSt.setString(4, cidade.getCEP());
            insereSt.executeUpdate();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "Erro ao incluir cidade: " + e.getMessage());
        } finally {
            try {
                insereSt.close();
                conexao.close();
                 JOptionPane.showMessageDialog(null, "Salvo com sucesso! " );
            } catch (Throwable e) {
                JOptionPane.showMessageDialog(null, "Erro ao fechar conexão" + e.getMessage());
            }
        }
    }

    public static void Atualizar(Cidade cidade) {
        Connection conexao = FabricaConexao.GeraConexao();

        PreparedStatement insereSt = null;

        String sql = (" UPDATE cidade SET idCid = ?, NomCid = ?, CEPCid = ?, EstadCid = ? WHERE idCid = ? ");

        try {
            insereSt = conexao.prepareStatement(sql);
            insereSt.setInt(1, cidade.getCodigo());
            insereSt.setString(2, cidade.getNome());
            insereSt.setString(3, cidade.getCEP());
            insereSt.setString(4, cidade.getEstado());
            insereSt.setInt(5, cidade.getCodigo());
            insereSt.executeUpdate();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "Erro ao atualizar cidade: " + e.getMessage());
        } finally {
            try {
                insereSt.close();
                conexao.close();
                 JOptionPane.showMessageDialog(null, "Atualizado com sucesso! " );
            } catch (Throwable e) {
                JOptionPane.showMessageDialog(null, "Erro ao fechar conexão: " + e.getMessage());
            }
        }
    }

    public static void Excluir(Cidade cidade) {
        Connection conexao = FabricaConexao.GeraConexao();

        PreparedStatement insereSt = null;

        String sql = ("DELETE FROM cidade WHERE idCid =  ?");

        try {
            insereSt = conexao.prepareStatement(sql);
            insereSt.setInt(1, cidade.getCodigo());
            insereSt.executeUpdate();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "Erro ao excluir cidade: " + e.getMessage());
        } finally {
            try {
                insereSt.close();
                conexao.close();
            } catch (Throwable e) {
                JOptionPane.showMessageDialog(null, "Erro ao fechar a conexão" + e.getMessage());
            }
        }
    }

    public static Cidade RecuperaObjetoCod(Double Codigo) {
        Connection conexao = FabricaConexao.GeraConexao();

        Cidade cidadeRecuperado = new Cidade();
        PreparedStatement consulta = null;
        ResultSet resultado = null;

        String sql = "SELECT * FROM Cidade WHERE IdCid = ?";

        try {
            consulta = conexao.prepareStatement(sql);
            consulta.setDouble(1, Codigo);
            resultado = consulta.executeQuery();

            resultado.next();

            cidadeRecuperado.setCodigo(resultado.getInt("IdCid"));
            cidadeRecuperado.setNome(resultado.getString("NomCid"));
            cidadeRecuperado.setEstado(resultado.getString("EstadCid"));
            cidadeRecuperado.setCEP(resultado.getString("CepCid"));

        } catch (SQLException e) {
            System.out.println("Erro ao recuperar cidade" + e.getMessage());
        } finally {
            try {
                consulta.close();
                resultado.close();
                conexao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar conexão com o BD" + e.getMessage());
            } finally {
                return cidadeRecuperado;
            }
        }
    }
    
    
      public static Cidade RecuperaObjetoNome(String Nome) {
         Connection conexao = FabricaConexao.GeraConexao();
         
         Cidade cidadeRecuperado = new Cidade();
         PreparedStatement consulta = null;
         ResultSet resultado = null;
         
         String sql = "SELECT * FROM Cidade WHERE Nomcid = ?";
         
         try
         {
             consulta = conexao.prepareStatement(sql);
             consulta.setString(1, Nome);
             resultado = consulta.executeQuery();
             
             resultado.next();
             
             cidadeRecuperado.setCodigo(resultado.getInt("IdCid"));
             cidadeRecuperado.setNome(resultado.getString("Nomcid"));
             cidadeRecuperado.setEstado(resultado.getString("EstadCid"));
             cidadeRecuperado.setCEP(resultado.getString("CepCid"));             
             
         }
         catch(SQLException e)
         {
             System.out.println("Erro ao recuperar cidade" + e.getMessage());
         }
         finally
         {
             try
             {
                 consulta.close();
                 resultado.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 System.out.println("Erro ao fechar conexão com o BD" + e.getMessage());
             }
             finally
             {
                 return cidadeRecuperado;
             }
         }
     }
     
      

    public static List<Cidade> RecuperaObjetos(String Nome) {
        Connection conexao = FabricaConexao.GeraConexao();

        List<Cidade> usuario = new ArrayList<Cidade>();
        Statement consulta = null;
        ResultSet resultado = null;

        String sql = "SELECT * FROM Cidade ";
        sql = sql + "WHERE NomCid like '%" + Nome + "%'";

        try {
            consulta = (Statement) conexao.createStatement();
            resultado = consulta.executeQuery(sql);

            while (resultado.next()) {
                Cidade usuarioTemp = new Cidade();
                usuarioTemp.setCodigo(resultado.getInt("IdCid"));
                usuarioTemp.setNome(resultado.getString("NomCid"));
                usuarioTemp.setEstado(resultado.getString("EstadCid"));
                usuarioTemp.setCEP(resultado.getString("CepCid"));
                usuario.add(usuarioTemp);
            }
        } catch (SQLException e) {
            System.out.println("Erro ao recuperar usuarios: " + e.getMessage());
        } finally {
            try {
                consulta.close();
                resultado.close();
                conexao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar a conexão: " + e.getMessage());
            } finally {
                return usuario;
            }
        }
    }

    private static String SQLNavegacao(int iOpcao, int iCodigoAtual) {
        String SQL = "";
        switch (iOpcao) {

            case cNavegacaoPrimeiro:
                SQL = "select MIN(idCid) AS cod from Cidade ";
                break;

            case cNavegacaoAnterior:
                SQL = "select MAX(idCid) AS cod from Cidade WHERE idCid < " + String.valueOf(iCodigoAtual);
                break;

            case cNavegacaoProximo:
                SQL = "select MIN(idCid) AS cod from Cidade WHERE idCid > " + String.valueOf(iCodigoAtual);
                break;

            case cNavegacaoUltimo:
                SQL = "select MAX(idCid) AS cod from Cidade ";
                break;
        }
        return SQL;
    }

    public static int PegaCodigoNavegacao(int iOpcao, int iCodigoAtual) {

        Connection conexao = FabricaConexao.GeraConexao();

        Statement consulta = null;
        ResultSet resultado = null;
        int CodigoEncontrado = -1;


        try {
            consulta = (Statement) conexao.createStatement();
            resultado = consulta.executeQuery(SQLNavegacao(iOpcao, iCodigoAtual));

            resultado.next();
            CodigoEncontrado = resultado.getInt("cod");

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "Erro ao executar SQL de Navegacao: " + e.getMessage() + "\n");

        } finally {
            try {
                consulta.close();
                conexao.close();
            } catch (Throwable e) {
                JOptionPane.showMessageDialog(null, "Erro ao fechar a conexão na funcao de navegacao: " + e.getMessage());
            }
        }
        return CodigoEncontrado;

    }

    public static ArrayList<Cidade> RecuperaObjetos() {
        Connection conexao = FabricaConexao.GeraConexao();

        ArrayList<Cidade> vetCidade = new ArrayList<Cidade>();
        Statement consulta = null;
        ResultSet resultado = null;

        String sql = "SELECT * FROM Cidade ";
        

        try {
            consulta = (Statement) conexao.createStatement();
            resultado = consulta.executeQuery(sql);

            while (resultado.next()) {
                Cidade cidadeTemp = new Cidade();
                cidadeTemp.setCodigo(resultado.getInt("IdCid"));
                cidadeTemp.setNome(resultado.getString("NomCid"));
                cidadeTemp.setEstado(resultado.getString("EstadCid"));
                cidadeTemp.setCEP(resultado.getString("CepCid"));
                vetCidade.add(cidadeTemp);
            }
        } catch (SQLException e) {
            System.out.println("Erro ao recuperar usuarios: " + e.getMessage());
        } finally {
            try {
                consulta.close();
                resultado.close();
                conexao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar a conexão: " + e.getMessage());
            } finally {
                return vetCidade;
            }
        }
    }

   
}
